AWS OrganizationsのSCPとリソースタグを利用して削除保護機能をエミュレートしてみる
こんにちは。サービスグループの武田です。
複数のAWSアカウントをまとめて管理できるAWS Organizationsというサービスがあります。これにはSCP(サービスコントロールポリシー)という管理下のメンバーアカウントの権限を制御できる機能が備わっており、先日のアップデートでかなりできることが増えました。アップデート情報については次のエントリを参照してください。
AWS OrganizationsのSCPでresourceやconditionが指定できるようになりさらに便利になりました
今回は、このSCPとリソースタグを組み合わせることでEC2インスタンスにあるような削除保護機能が実現できないかな、ということで試してみました。
エミュレート可能な条件
今回の内容はどんなAWSリソースでも実現可能かというと、そんなことはありません。次の2つの条件を満たせるリソースのみが可能です。
- 対象リソースにタグが付けられる
- ポリシーのConditionに対象リソースのリソースタグを指定できる
特に2が重要で、リソースにタグは付けられるけどConditionで指定できないということがそれなりにありそうです。Conditionでの指定可否は各リソースによって異なります。また、リソースタグの条件指定方法はサービスによりかなりばらつきがあるため、最新のドキュメントで確認する必要があります。
Actions, Resources, and Condition Keys for AWS Services - AWS Identity and Access Management
今回のゴール
- IAMロールの削除を、対象リソースのタグが
DeleteProtection=true
のとき拒否する true
以外やタグがない場合は拒否しないDeleteProtection
タグ自体の削除操作はひとまずノータッチ
検証の前提
今回の検証内容を実際に行うためにはあらかじめ次の環境を用意する必要があります。
- AWS Organizationsが有効になっているマスターアカウント
- その組織に所属しているメンバーアカウント
また組織のルートには次のFullAWSAccess
ポリシーがアタッチされています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }
やってみた
マスターアカウントでSCPを設定して対象アカウントにアタッチ
まずはマスターアカウントでマネジメントコンソールにアクセスします。AWS Organizationsのページにアクセスし、次のようなポリシーを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "iam:DeleteRole" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "iam:ResourceTag/DeleteProtection": [ "true" ] } } } ] }
次にこのポリシーをアタッチします。今回は検証用のメンバーアカウントに直接アタッチします。
メンバーアカウントでIAMロールを作成して削除できないことを確認
次にメンバーアカウントでマネジメントコンソールにアクセスします。IAMのページにアクセスしIAMロールを作成します。タグのキーと値のみが重要で、ほかは任意の値で問題ありません。
作成できました。
作ったばかりですが削除をしてみます。
狙いどおり削除できません!
タグの値を変更して削除できることを確認
DeleteProtection
の値をtrue
以外の値に変更します。今回はfalse
とします。
この状態で削除をしてみます。
消せました!(削除後のメッセージが出ないので伝わりにくいのですが・・)
まとめ
SCPとタグを組み合わせて何かできないかなという思い付きからやってみた検証でした。個人的な収穫としては「エミュレート可能な条件」でも書いたConditionの記述方法の理解が深まったことです。aws:ResourceTag/${tag-key}
という条件キーも用意されており一部のサービスではこれを使うのですが、ドキュメントを見つけるまで使い分けなどが分からず結構時間を食ったところでした。
それでは、このエントリが誰かの役に立てば幸いです。